Skip to main content

5. Github Actions

GitHub Actions est un outil d'automatisation intégré à GitHub qui permet d'exécuter des workflows (flux de travail) automatiquement en réponse à des événements (push, pull request, etc.).

Cas d'usage

  • Exécuter des tests à chaque push
  • Vérifier le formatage du code
  • Valider les commits
  • Déployer automatiquement en production
  • Publier des packages npm
  • Envoyer des notifications

Pourquoi c'est important ?

Sans CI/CD, vous devez manuellement :

  1. Vérifier que le code compile
  2. Exécuter tous les tests
  3. Vérifier le linting
  4. S'assurer que le formatage est correct

Problème : Si un développeur oublie une étape, du code cassé peut être mergé. Avec GitHub Actions, tout est automatique et garanti

Concepts de base

Workflow

Un workflow est un fichier YAML qui définit les actions à exécuter. Il est stocké dans .github/workflows/.

Job

Un job est un ensemble d'étapes (steps) qui s'exécutent sur une machine virtuelle.

Step

Une step est une action individuelle (installer des dépendances, exécuter des tests, etc.).

Event

Un event déclenche l'exécution d'un workflow (push, pull_request, schedule, etc.).

Notre premier workflow

Nous allons créer un workflow qui s'exécute à chaque pull request et vérifie :

  1. Que le code compile
  2. Que les tests passent
  3. Que le linting est correct
  4. Que le formatage est bon

Créer le fichier workflow

Créez le fichier .github/workflows/ci.yml :

name: CI

on:
pull_request:
branches: [main]
push:
branches: [main]

jobs:
test:
name: Test and Lint
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Run linter
run: npm run lint

- name: Check code formatting
run: npm run format:check

- name: Run type checking
run: npm run typecheck

- name: Run tests
run: npm run test

Explication du workflow

Déclencheurs :

on:
pull_request:
branches: [main]
push:
branches: [main]
  • Le workflow s'exécute à chaque pull request vers main
  • Et à chaque push sur main

Job :

jobs:
test:
runs-on: ubuntu-latest
  • Nom du job : test
  • S'exécute sur Ubuntu (machine virtuelle GitHub)

Steps :

  1. Checkout : Récupère le code du repository
- uses: actions/checkout@v4
  1. Setup Node.js : Installe Node.js
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
  1. Installer les dépendances :
- run: npm ci

npm ci est plus rapide que npm install et utilise le package-lock.json.

  1. Exécuter les vérifications :
- run: npm run lint
- run: npm run format:check
- run: npm run typecheck
- run: npm run test

Scripts nécessaires

Assurez-vous que votre package.json contient les scripts :

{
"scripts": {
"lint": "eslint .",
"format:check": "prettier --check .",
"typecheck": "tsc --noEmit",
"test": "vitest run"
}
}

Tester le workflow

  1. Créez une branche :
git checkout -b test-ci
  1. Faites une modification :
echo "console.log('test');" >> src/index.ts
  1. Commit et push :
git add .
git commit -m "feat: test CI workflow"
git push origin test-ci
  1. Créez une Pull Request sur GitHub

  2. Observez l'exécution :

  • Allez sur votre repository GitHub
  • Onglet Pull requests → Votre PR
  • Vous verrez le workflow s'exécuter en temps réel

Si tout est vert, le code est prêt à être mergé ! Si des erreurs apparaissent, le code doit être corrigé.

Protections de branche

Pour forcer que la CI passe avant de merger, configurez des branch protection rules.

Configuration

  1. Allez sur votre repository GitHub
  2. SettingsBranchesAdd rule
  3. Branch name pattern : main
  4. Cochez :
    • Require a pull request before merging
    • Require status checks to pass before merging
    • Require branches to be up to date before merging
  5. Sélectionnez les checks : Test and Lint
  6. Save changes

Résultat

Maintenant, impossible de merger une PR si :

  • Les tests échouent
  • Le linting échoue
  • Le formatage est incorrect
  • Le type checking échoue

Seul du code valide peut être mergé ! 🎉

Protections supplémentaires

Require pull request reviews

Obligez au moins 1 revue avant de merger :

SettingsBranchesBranch protection rule :

  • Require approvals : 1

Dismiss stale reviews

Si le code change après une revue, annulez l'approbation :

  • Dismiss stale pull request approvals when new commits are pushed

Require conversation resolution

Obligez à résoudre tous les commentaires avant de merger :

  • Require conversation resolution before merging

Secrets et variables d'environnement

Pour des données sensibles (clés API, tokens), utilisez les GitHub Secrets :

  1. SettingsSecrets and variablesActionsNew repository secret
  2. Nom : JWT_SECRET
  3. Valeur : votre-secret

Utilisez-le dans votre workflow :

env:
JWT_SECRET: ${{ secrets.JWT_SECRET }}